using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.Mvc;
using System.Web.Mvc.Ajax;
using Aga.Psad.Backend.Repositories;
using System.Web.Security;
using MvcMembership;
using PagedList;
using AutoMapper;
using Aga.Psad.Backend.Entities;
using Aga.Psad.Mvc.Models;
using System.IO;
using Aga.Psad.Mvc.Models.Codere;

namespace Aga.Psad.Mvc.Controllers
{   
    [Authorize(Roles =
        UserAdministrationController.ROLE_CLIENTEOTRO + "," +
        UserAdministrationController.ROLE_VISUALIZADOR)]
    public class CodereController : ControllerBase
    {
        public const int PageSize = 10;

        /// <summary>
        /// Gets the name of the user.
        /// </summary>
        /// <value>The name of the user.</value>
        protected string UserName
        {
            get
            {
                if (Request.IsAuthenticated)
                    return Request.Params["AUTH_USER"];
                else
                    return string.Empty;
            }
        }

        public ActionResult ArchivoGeneral(string TextoBuscar, int? index)
        {

            if (UserName != "codere" && UserName != "admin")
                RedirectToAction("Home", "Index");

            FiltroBusquedaViewModel model = new FiltroBusquedaViewModel(false);

            UpdateModel(model);

            if (!index.HasValue)
            {
                model.MostrarResultados = false;
            }
            else
            {
                model.MostrarResultados = true;

                model.ArchivosGenerales = new PagedList<CodereArchivoGeneralViewModel>(
                    SearchArchivoGeneral(TextoBuscar, index ?? 0, PageSize), index ?? 0, PageSize);
            }

            return View(model);
        }

        [AcceptVerbs(HttpVerbs.Post)]
        public ActionResult ArchivoGeneral(int? index, FormCollection collection)
        {
            if (UserName != "codere" && UserName != "admin")
                RedirectToAction("Home", "Index");

            try
            {
                FiltroBusquedaViewModel model = new FiltroBusquedaViewModel(false);

                UpdateModel(model);

                model.MostrarResultados = true;

                model.ArchivosGenerales = new PagedList<CodereArchivoGeneralViewModel>(
                    SearchArchivoGeneral(model.TextoBuscar, index ?? 0, PageSize), index ?? 0, PageSize);

                return View(model);
            }
            catch (Exception ex)
            {
                return ShowError(ex);
            }
        }

        public ActionResult LegajoPersonal(string TextoBuscar, int? index)
        {

            if (UserName != "codere" && UserName != "admin")
                RedirectToAction("Home", "Index");

            FiltroBusquedaViewModel model = new FiltroBusquedaViewModel(false);

            UpdateModel(model);

            if (!index.HasValue)
            {
                model.MostrarResultados = false;
            }
            else
            {
                model.MostrarResultados = true;

                model.LegajosPersonal = new PagedList<CodereLegajoPersonalViewModel>(
                    SearchLegajoPersonal(TextoBuscar, index ?? 0, PageSize), index ?? 0, PageSize);
            }

            return View(model);
        }

        [AcceptVerbs(HttpVerbs.Post)]
        public ActionResult LegajoPersonal(int? index, FormCollection collection)
        {
            if (UserName != "codere" && UserName != "admin")
                RedirectToAction("Home", "Index");

            try
            {
                FiltroBusquedaViewModel model = new FiltroBusquedaViewModel(false);

                UpdateModel(model);

                model.MostrarResultados = true;

                model.LegajosPersonal = new PagedList<CodereLegajoPersonalViewModel>(
                    SearchLegajoPersonal(model.TextoBuscar, index ?? 0, PageSize), index ?? 0, PageSize);

                return View(model);
            }
            catch (Exception ex)
            {
                return ShowError(ex);
            }
        }

        public ActionResult Libros(string TextoBuscar, int? index)
        {

            if (UserName != "codere" && UserName != "admin")
                RedirectToAction("Home", "Index");

            FiltroBusquedaViewModel model = new FiltroBusquedaViewModel(false);

            UpdateModel(model);

            if (!index.HasValue)
            {
                model.MostrarResultados = false;
            }
            else
            {
                model.MostrarResultados = true;

                model.Libros = new PagedList<CodereLibrosViewModel>(
                    SearchLibros(TextoBuscar, index ?? 0, PageSize), index ?? 0, PageSize);
            }

            return View(model);
        }

        [AcceptVerbs(HttpVerbs.Post)]
        public ActionResult Libros(int? index, FormCollection collection)
        {
            if (UserName != "codere" && UserName != "admin")
                RedirectToAction("Home", "Index");

            try
            {
                FiltroBusquedaViewModel model = new FiltroBusquedaViewModel(false);

                UpdateModel(model);

                model.MostrarResultados = true;

                model.Libros = new PagedList<CodereLibrosViewModel>(
                    SearchLibros(model.TextoBuscar, index ?? 0, PageSize), index ?? 0, PageSize);

                return View(model);
            }
            catch (Exception ex)
            {
                return ShowError(ex);
            }
        }

        public ActionResult OrdenesDePago(string TextoBuscar, int? index)
        {

            if (UserName != "codere" && UserName != "admin")
                RedirectToAction("Home", "Index");

            FiltroBusquedaViewModel model = new FiltroBusquedaViewModel(false);

            UpdateModel(model);

            if (!index.HasValue)
            {
                model.MostrarResultados = false;
            }
            else
            {
                model.MostrarResultados = true;

                model.OrdenesDePago = new PagedList<CodereOrdenesDePagoViewModel>(
                    SearchOrdenesDePago(TextoBuscar, index ?? 0, PageSize), index ?? 0, PageSize);
            }

            return View(model);
        }

        [AcceptVerbs(HttpVerbs.Post)]
        public ActionResult OrdenesDePago(int? index, FormCollection collection)
        {
            if (UserName != "codere" && UserName != "admin")
                RedirectToAction("Home", "Index");

            try
            {
                FiltroBusquedaViewModel model = new FiltroBusquedaViewModel(false);

                UpdateModel(model);

                model.MostrarResultados = true;

                model.OrdenesDePago = new PagedList<CodereOrdenesDePagoViewModel>(
                    SearchOrdenesDePago(model.TextoBuscar, index ?? 0, PageSize), index ?? 0, PageSize);

                return View(model);
            }
            catch (Exception ex)
            {
                return ShowError(ex);
            }
        }

        public ActionResult Historico(string TextoBuscar, int? index)
        {

            if (UserName != "codere" && UserName != "admin")
                RedirectToAction("Home", "Index");

            FiltroBusquedaViewModel model = new FiltroBusquedaViewModel(false);

            UpdateModel(model);

            if (!index.HasValue)
            {
                model.MostrarResultados = false;
            }
            else
            {
                model.MostrarResultados = true;

                model.Historico = new PagedList<CodereHistoricoViewModel>(
                    SearchHistorico(TextoBuscar, index ?? 0, PageSize), index ?? 0, PageSize);
            }

            return View(model);
        }

        [AcceptVerbs(HttpVerbs.Post)]
        public ActionResult Historico(int? index, FormCollection collection)
        {
            if (UserName != "codere" && UserName != "admin")
                RedirectToAction("Home", "Index");

            try
            {
                FiltroBusquedaViewModel model = new FiltroBusquedaViewModel(false);

                UpdateModel(model);

                model.MostrarResultados = true;

                model.Historico = new PagedList<CodereHistoricoViewModel>(
                    SearchHistorico(model.TextoBuscar, index ?? 0, PageSize), index ?? 0, PageSize);

                return View(model);
            }
            catch (Exception ex)
            {
                return ShowError(ex);
            }
        }


        public List<CodereArchivoGeneralViewModel> SearchArchivoGeneral(string searchCriteria, int index, int pageSize)
        {
            var repository = new RepositoryBase<CodereArchivoGeneral>();

            IEnumerable<CodereArchivoGeneral> documentosDelUsuario = repository.GetAll();

            searchCriteria = (searchCriteria ?? string.Empty).Trim().ToUpper();

            if (documentosDelUsuario.Count() > 0 && !String.IsNullOrEmpty(searchCriteria))
            {
                // ToDo: Check the predicate!
                documentosDelUsuario =
                    documentosDelUsuario.Where(
                    d =>
                        (d.Caja != null && d.Caja.ToUpper().Contains(searchCriteria))
                        || (d.CajaAnterior != null && d.CajaAnterior.ToUpper().Contains(searchCriteria))
                        || (d.Consulta != null && d.Consulta.ToUpper().Contains(searchCriteria))
                        || (d.Descripcion != null && d.Descripcion.ToUpper().Contains(searchCriteria))
                        || (d.DesdeFecha != null && d.DesdeFecha.ToUpper().Contains(searchCriteria))
                        || (d.DesdeNumero != null && d.DesdeNumero.ToUpper().Contains(searchCriteria))
                        || (d.Edificio != null && d.Edificio.ToUpper().Contains(searchCriteria))
                        || (d.EmpresaBingo != null && d.EmpresaBingo.ToUpper().Contains(searchCriteria))
                        || (d.HastaFecha != null && d.HastaFecha.ToUpper().Contains(searchCriteria))
                        || (d.HastaNumero != null && d.HastaNumero.ToUpper().Contains(searchCriteria))
                        || (d.Observaciones != null && d.Observaciones.ToUpper().Contains(searchCriteria))
                        || (d.Sector != null && d.Sector.ToUpper().Contains(searchCriteria))
                    );

            }

            Mapper.CreateMap<CodereArchivoGeneral, CodereArchivoGeneralViewModel>();

            // Aplico los filtros
            return documentosDelUsuario
                    .Select(a => Mapper.Map<CodereArchivoGeneral, CodereArchivoGeneralViewModel>(a))
                    .ToList();
        }

        public List<CodereLegajoPersonalViewModel> SearchLegajoPersonal(string searchCriteria, int index, int pageSize)
        {
            var repository = new RepositoryBase<CodereLegajoPersonal>();

            IEnumerable<CodereLegajoPersonal> documentosDelUsuario = repository.GetAll();

            searchCriteria = (searchCriteria ?? string.Empty).Trim().ToUpper();

            if (documentosDelUsuario.Count() > 0 && !String.IsNullOrEmpty(searchCriteria))
            {
                // ToDo: Check the predicate!
                documentosDelUsuario =
                    documentosDelUsuario.Where(
                    d =>
                        (d.Apellido != null && d.Apellido.ToUpper().Contains(searchCriteria))
                        || (d.Caja != null && d.Caja.ToUpper().Contains(searchCriteria))
                        || (d.Nombre != null && d.Nombre.ToUpper().Contains(searchCriteria))
                        || (d.NumeroLegajo != null && d.NumeroLegajo.ToUpper().Contains(searchCriteria))
                        || (d.Observaciones != null && d.Observaciones.ToUpper().Contains(searchCriteria))
                        || (d.ResponsableCarga != null && d.ResponsableCarga.ToUpper().Contains(searchCriteria))
                    );

            }

            Mapper.CreateMap<CodereLegajoPersonal, CodereLegajoPersonalViewModel>();

            // Aplico los filtros
            return documentosDelUsuario
                    .Select(a => Mapper.Map<CodereLegajoPersonal, CodereLegajoPersonalViewModel>(a))
                    .ToList();
        }

        public List<CodereLibrosViewModel> SearchLibros(string searchCriteria, int index, int pageSize)
        {
            var repository = new RepositoryBase<CodereLibro>();

            IEnumerable<CodereLibro> documentosDelUsuario = repository.GetAll();

            searchCriteria = (searchCriteria ?? string.Empty).Trim().ToUpper();

            if (documentosDelUsuario.Count() > 0 && !String.IsNullOrEmpty(searchCriteria))
            {
                // ToDo: Check the predicate!
                documentosDelUsuario =
                    documentosDelUsuario.Where(
                    d =>
                        (d.Caja != null && d.Caja.ToUpper().Contains(searchCriteria))
                        || (d.CajaAnterior != null && d.CajaAnterior.ToUpper().Contains(searchCriteria))
                        || (d.Consulta != null && d.Consulta.ToUpper().Contains(searchCriteria))
                        || (d.Descripcion != null && d.Descripcion.ToUpper().Contains(searchCriteria))
                        || (d.DesdeFecha != null && d.DesdeFecha.ToUpper().Contains(searchCriteria))
                        || (d.DesdeNumero != null && d.DesdeNumero.ToUpper().Contains(searchCriteria))
                        || (d.Edificio != null && d.Edificio.ToUpper().Contains(searchCriteria))
                        || (d.EmpresaBingo != null && d.EmpresaBingo.ToUpper().Contains(searchCriteria))
                        || (d.HastaFecha != null && d.HastaFecha.ToUpper().Contains(searchCriteria))
                        || (d.HastaNumero != null && d.HastaNumero.ToUpper().Contains(searchCriteria))
                        || (d.Observaciones != null && d.Observaciones.ToUpper().Contains(searchCriteria))
                        || (d.Sector != null && d.Sector.ToUpper().Contains(searchCriteria))
                    );

            }

            Mapper.CreateMap<CodereLibro, CodereLibrosViewModel>();

            // Aplico los filtros
            return documentosDelUsuario
                    .Select(a => Mapper.Map<CodereLibro, CodereLibrosViewModel>(a))
                    .ToList();
        }

        public List<CodereOrdenesDePagoViewModel> SearchOrdenesDePago(string searchCriteria, int index, int pageSize)
        {
            var repository = new RepositoryBase<CodereOrdenesDePago>();

            IEnumerable<CodereOrdenesDePago> documentosDelUsuario = repository.GetAll();

            searchCriteria = (searchCriteria ?? string.Empty).Trim().ToUpper();

            if (documentosDelUsuario.Count() > 0 && !String.IsNullOrEmpty(searchCriteria))
            {
                // ToDo: Check the predicate!
                documentosDelUsuario =
                    documentosDelUsuario.Where(
                    d =>
                        (d.Caja != null && d.Caja.ToUpper().Contains(searchCriteria))
                        || (d.Numero != null && d.Numero.ToUpper().Contains(searchCriteria))
                        || (d.Fecha != null && d.Fecha.ToUpper().Contains(searchCriteria))
                        || (d.Lote != null && d.Lote.ToUpper().Contains(searchCriteria))
                        || (d.Empresa != null && d.Empresa.ToUpper().Contains(searchCriteria))
                        || (d.ResponsableCarga != null && d.ResponsableCarga.ToUpper().Contains(searchCriteria))
                        || (d.Observaciones != null && d.Observaciones.ToUpper().Contains(searchCriteria))
                    );

            }

            Mapper.CreateMap<CodereOrdenesDePago, CodereOrdenesDePagoViewModel>();

            // Aplico los filtros
            return documentosDelUsuario
                    .Select(a => Mapper.Map<CodereOrdenesDePago, CodereOrdenesDePagoViewModel>(a))
                    .ToList();
        }

        public List<CodereHistoricoViewModel> SearchHistorico(string searchCriteria, int index, int pageSize)
        {
            var repository = new RepositoryBase<CodereHistorico>();

            IEnumerable<CodereHistorico> documentosDelUsuario = repository.GetAll();

            searchCriteria = (searchCriteria ?? string.Empty).Trim().ToUpper();

            if (documentosDelUsuario.Count() > 0 && !String.IsNullOrEmpty(searchCriteria))
            {
                // ToDo: Check the predicate!
                documentosDelUsuario =
                    documentosDelUsuario.Where(
                    d =>
                        (d.Caja != null && d.Caja.ToUpper().Contains(searchCriteria))
                        || (d.CajaAnterior != null && d.CajaAnterior.ToUpper().Contains(searchCriteria))
                        || (d.Consulta != null && d.Consulta.ToUpper().Contains(searchCriteria))
                        || (d.Descripcion != null && d.Descripcion.ToUpper().Contains(searchCriteria))
                        || (d.DesdeFecha != null && d.DesdeFecha.ToUpper().Contains(searchCriteria))
                        || (d.DesdeNumero != null && d.DesdeNumero.ToUpper().Contains(searchCriteria))
                        || (d.EmpresaBingo != null && d.EmpresaBingo.ToUpper().Contains(searchCriteria))
                        || (d.HastaFecha != null && d.HastaFecha.ToUpper().Contains(searchCriteria))
                        || (d.HastaNumero != null && d.HastaNumero.ToUpper().Contains(searchCriteria))
                        || (d.Observaciones != null && d.Observaciones.ToUpper().Contains(searchCriteria))
                    );

            }

            Mapper.CreateMap<CodereHistorico, CodereHistoricoViewModel>();

            // Aplico los filtros
            return documentosDelUsuario
                    .Select(a => Mapper.Map<CodereHistorico, CodereHistoricoViewModel>(a))
                    .ToList();
        }

    }
}
